单片机怎么理解ADD,ADDC,SUBB等算术指令

您所在的位置:网站首页 进位的意思是什么 是加 还是减 单片机怎么理解ADD,ADDC,SUBB等算术指令

单片机怎么理解ADD,ADDC,SUBB等算术指令

2024-07-15 23:02| 来源: 网络整理| 查看: 265

一. 看本文需先对原码,反码,补码的概念有一定理解,了解程序状态字PSW中Cy位表示最高位进位,OV位(有概念即可,只和带符号运算有关,文中会讲),且了解以十六进制表示的内容会加后缀H,否则为十进制,加后缀B为二进制表示。

二. 先理解补码的意义:用时钟来比喻吧,时钟一共有12个时刻,0时即时12时

如果把+5理解为顺时针旋转5个时刻,那-4为逆时针旋转4个时刻。那么,逆时针旋转4个时刻,和瞬时针旋转4个时刻是不是就相同,而如果规定+就是顺时针旋转,-是逆时针旋转,那-也可以表示为顺时针旋转,对吧。

而4+8=12,和时钟0-12相同,即-4,和+8效果是相同的,因此在这个钟内,负数都可以用正数表示

三. 再看8位的单片机,同样原理,是不是补码+原码=FFH+1(256),为什么要加1,这是因为反码+原码=FFH(255)

四. 八位数的加减运算  

代码示例:

下列代码结果=direct_1+direct_2,结果在A累加器中,下面结果同理。 MOV A,#direct_1 ADD A,#direct_2 下列代码结果=direct_1+direct_2+Cy,Cy为上次运算进位 MOV A,#direct_1 ADDC A,#direct_2 下列代码结果=direct_1-direct_2-Cy,Cy为上次运算借位,其中CLR C可以使Cy位清零 MOV A,#direct_1 SUBB A,#direct_2 ADD,本质是进行8位无符号二进制数+8位无符号二进制数,最高位有进位,Cy会为1,没进位为0;AC位和最高位的进位和次高位的进位有关,表示如果是有符号数运算,运算结果是不是正确的,错误则为1,正确为0(文末讲为什么)。比如A2H+21H=C3HADDC,会在ADD的基础上,再加上前次运算结果得到的Cy位的值SUBB,本质是进行8位无符号二进制数的减法,具体流程是,对被减数进行补码,不是在课上学的补码,而是上述时钟的补码,即原码+补码=256,补码=256-原码,然后上述代码中的direct_1+direct_2的补码,舍去超出第八位的结果后放到累加器A中,Cy位会记录进位,神奇的是OV位同样能得到如果看成带符号运算(即视最高位为符号位)是否正确的结果。这是为什么呢(划重点)?回到时钟上了,对1于无符号的数,原码+补码=256。然而,对于有符号的数的负数来讲,他的最高位没变,只有低7位进行了补码操作,如果不看最高位,那么原码+补码=128,比如10000001B,他的除去最高位后补码就是1111111B,那么后七位之和不就是0000001B+1111111B=128吗OV是怎么得到的呢?OV=最高位进位异或次高位进位。如果进位为1和0,OV就等于1,说明计算错误;如果是0和0,或1和1,OV都为0,说明计算正确很神奇?这是为什么呢,加法器计算的本质不就是在时刻总量为256的时钟上跑步吗?所以对于无符号的计算,加法运算的结果都是正确的(最高位进位放在Cy,两个在时钟内的数相加总不能超过两圈吧)对于有符号的运算,就该OV上场了,现在想想,如果把有符号的数(不看最高位,那么原码+补码=128)放到原码+补码=256的时钟上跑,会发生什么?先看原码,原码不会变,在256的时钟上顺时针跑的路程相同;再看负数,举个例子10000000B,如果看作无符号数,补码是01111111B+1,如果看作有符号数,那么补码是11111111B+1,两者有什么区别发现了吗,好家伙,就第一位数差了个1,这是什么意思呢,两者相减,是不是就等于10000000B了,好家伙,刚好是256时钟的半圈(128),也就是说,一个有符号数和没符号数在256的时钟上相差了半圈。也就是说,一个半圈都不跑和跑两个半圈的时候,有符号数和无符号数恰好在256的时钟上结果一致。又到了举例子的时候了看图更生动形象理解

低七位的进位,在128的时钟上跑,如果跑超了一圈,那么舍去一圈后,结果在128的时钟上就是正确的。但是,这舍去的一圈在256一圈的时钟上只是半圈,可不能舍去

然后呢,如果符号位为1,那在256一圈时钟上就还有半圈可以跑,两者相加,在256的时钟上不就消除多出的两个半圈(和一圈)了,计算结果就是正确的

我们要做的就是如下图,让结果跑在正确的半圈上,其中左半圈代表这个数是负数,右半圈正数,所以多跑半圈正负号就变了,数值也变成128-后七位代表的数了

那么如果OV等于1,结果错了,怎么修正结果呢?简单,他原本多跑了半圈,再让他再多跑半圈,凑足一圈,加上10000000B就行了。

文末结语:说明了8位计算时的具体流程,想必更多位时诸位也会写,就不一一详述了,以后有时间再写多位的计算步骤吧,分最高的8位,中间很多的8位,最后的8位应该可以分部计算带符号的加减法。写本文主要是胡汉才主编的单片机接口与原理技术中描述得晦涩难懂,看了好久没看懂,只好自食其力了(直接讲结果,没讲为什么)。

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3